/*
 * Copyright (C) 2012 POAS.VSTU
 */

package model;

import java.util.ArrayList;
import java.util.Random;

/** Класс компьютерного игрока. */
public class ComputerPlayer extends Player{

    public ComputerPlayer(String name, GameModel gm) {
        super(name, gm);
    }

    public ComputerPlayer(String name) {
        super(name);
    }

    /** Начать заход. */
    @Override
    public void beginRound() {
        super.beginRound();
        Face face;              // Выбранный игроком ранг
        int numCards;           // Число выбранных карт
        Random rand = new Random();

        // Выбираем ранг
        face = Face.values()[rand.nextInt(9)];

        getUI().getPanel().setRank(face);

        try {
            Thread.sleep(791);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Выбираем карты
        PlayerCardPile pile = getCards();
        ArrayList<Integer> allIndex = new ArrayList<> ();
        for(Card card : pile.mCards)
            allIndex.add(pile.getIndexByOrder(card));
            
        // Запомним карты выбранного ранее наминала, чтобы сначала выбрать их 
        ArrayList<Integer> index = new ArrayList<> ();
        for(Card card : pile.mCards)
            if(card.getFace() == face)
                index.add(pile.getIndexByOrder(card));
        
        numCards = rand.nextInt(getCards().size());
        if(numCards > 6)
            numCards -= 6;
        for(int i = 0; i < numCards + 1; i++)
        {
            // Если есть карта выбранного ранее наминала - выбираем её
            if(!index.isEmpty())
            {
                getCards().switchCard(getCards().mCards.get((Integer)index.get(index.size() - 1)));
                
                for(int j = 0; j < allIndex.size(); j++)
                    if(index.get(index.size() - 1) == allIndex.get(j))
                        allIndex.remove(j);
                
                index.remove(index.size() - 1);
            }
            else    // Иначе выбираем случайную карту, которую ещё не выбирали
            {
                getCards().switchCard(getCards().mCards.get(allIndex.get(allIndex.size() - 1)));
                allIndex.remove(allIndex.size() - 1);
            }
        }

        // Перемещаем карты игрока на кон
        getModel().movePlayerCardsToKitty(this);

        // Завершить ход
        getUI().endTurn();
        endTurn();
    }

    /** Продолжить заход. */
    @Override
    public void proceedRound() {
        super.proceedRound();
        int numCards;           // Число выбранных карт
        boolean believe;        // Верить или не верить
        Random rand = new Random();

        believe = rand.nextBoolean();
        if (getCards().size() == 0)
            believe = false;

        // Задержка перед принятием решения.
        try {
            Thread.sleep(791);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Если верим
        if(believe)
        {
            getUI().showBelieveLabel();
            try {
                Thread.sleep(791);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            // Выбираем карты
            PlayerCardPile pile = getCards();
            ArrayList<Integer> allIndex = new ArrayList<> ();
            for(Card card : pile.mCards)
                allIndex.add(pile.getIndexByOrder(card));
            
            numCards = rand.nextInt(getCards().size());
            if(numCards > 6)
                numCards -= 6;
            for(int i = 0; i < numCards + 1; i++)
            {
                // Выбираем случайную карту, которую ещё не выбирали
                getCards().switchCard(getCards().mCards.get(allIndex.get(allIndex.size() - 1)));
                allIndex.remove(allIndex.size() - 1);
            }
          
            // Сообщить модели игры, что нужно выложить карты игрока
            getModel().movePlayerCardsToKitty(this);

            // Завершить ход
            getUI().endTurn();
            endTurn();

        }
        else // Если не верим
        {
            getUI().showDisbelieveLabel();
            try {
                Thread.sleep(791);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // Выбираем случайную карту
            CardPile kitty = getModel().getKitty().rightPart();
            int index = rand.nextInt(kitty.size());

            GameProcessEvent event = GameProcessEvent.playerChecksCard(this, this, kitty.mCards.get(index));
            getUI().getPanel().playerCheckedCard(event);
        }
    }
}